<!doctype html>



  


<html class="theme-next mist use-motion" lang="zh-Hans">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>



<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />












  
  
  <link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />




  
  
  
  

  
    
    
  

  

  

  

  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=5.1.0" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="chrisrc, christtrc, 前端, 后端, 系统架构, 微服务, Microservice, 容器, Docker, DC/OS, DCOS, Mesos, Marathon, Marathon-LB, HAProxy, VIPs, Rex-Ray, GlusterFS, Ceph, Prometheus, DevOps, Jenkins, IT自动化, 大数据, Storm, Spark, Akka, Cassandra, 互联网金融, 互联网彩票, 互联网, 移动互联网, 物联网, 博客, 个人网站, Hexo, NexT" />








  <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=5.1.0" />






<meta property="og:type" content="website">
<meta property="og:title" content="山中，山外与俯瞰">
<meta property="og:url" content="http://chrisrc.me/page/7/index.html">
<meta property="og:site_name" content="山中，山外与俯瞰">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="山中，山外与俯瞰">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Mist',
    sidebar: {"position":"left","display":"post"},
    fancybox: true,
    motion: true,
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://chrisrc.me/page/7/"/>





  <title> 山中，山外与俯瞰 </title>
</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  










  
  
    
  

  <div class="container one-collumn sidebar-position-left 
   page-home 
 ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-meta ">
  

  <div class="custom-logo-site-title">
    <a href="/"  class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <span class="site-title">山中，山外与俯瞰</span>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>
  <p class="site-subtitle">一次永不停止的探索之旅</p>
</div>

<div class="site-nav-toggle">
  <button>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
  </button>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-dcos">
          <a href="/dcos" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-book"></i> <br />
            
            DC/OS
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />
            
            关于
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
            
            标签
          </a>
        </li>
      

      
        <li class="menu-item menu-item-search">
          
            <a href="javascript:;" class="st-search-show-outputs">
          
            
              <i class="menu-item-icon fa fa-search fa-fw"></i> <br />
            
            搜索
          </a>
        </li>
      
    </ul>
  

  
    <div class="site-search">
      
  <form class="site-search-form">
  <input type="text" id="st-search-input" class="st-search-input st-default-search-input" />
</form>

<script type="text/javascript">
  (function(w,d,t,u,n,s,e){w['SwiftypeObject']=n;w[n]=w[n]||function(){
    (w[n].q=w[n].q||[]).push(arguments);};s=d.createElement(t);
    e=d.getElementsByTagName(t)[0];s.async=1;s.src=u;e.parentNode.insertBefore(s,e);
  })(window,document,'script','//s.swiftypecdn.com/install/v2/st.js','_st');

  _st('install', 'R9GcmhBwxpsAGLNCsquZ','2.0.0');
</script>



    </div>
  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            
  <section id="posts" class="posts-expand">
    
      

  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
  <link itemprop="mainEntityOfPage" href="http://chrisrc.me/2015/05/29/java-osgi-fragment-bundle/">

  <span style="display:none" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <meta itemprop="name" content="chrisrc">
    <meta itemprop="description" content="">
    <meta itemprop="image" content="/images/avatar.gif">
  </span>

  <span style="display:none" itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
    <meta itemprop="name" content="山中，山外与俯瞰">
    <span style="display:none" itemprop="logo" itemscope itemtype="http://schema.org/ImageObject">
      <img style="display:none;" itemprop="url image" alt="山中，山外与俯瞰" src="">
    </span>
  </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2015/05/29/java-osgi-fragment-bundle/" itemprop="url">
                  通过OSGi Bundle进行资源隔离
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>
              <time title="Post created" itemprop="dateCreated datePublished" datetime="2015-05-29T10:26:27+08:00">
                2015-05-29
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
              <span class="post-meta-divider">|</span>
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/OSGi/" itemprop="url" rel="index">
                    <span itemprop="name">OSGi</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <a href="/2015/05/29/java-osgi-fragment-bundle/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count ds-thread-count" data-thread-key="2015/05/29/java-osgi-fragment-bundle/" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          

          
          

          

          

        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="简述"><a href="#简述" class="headerlink" title="简述"></a>简述</h2><p>随着OSGi越来越被大家所熟知，基于OSGi的开发成为一种趋势。在OSGi中，两个核心元素是Bundle和Service，本文仅涉及Bundle，Service不在讨论范围之内。</p>
<p>OSGi中的Bundle通常被看做是一个细粒度的功能模块，为整个基于OSGi的系统提供某项功能。但是，Bundle的资源组织特性，使其可以不仅仅作为一个功能模块，也可以作为资源组织模块来应用。Bundle的资源组织特性是Bundle的功能特性的基础支撑。Bundle的资源组织特性可以在某些特定应用中得到充分的利用，本文就Bundle的资源组织特性在一类特定需求中的应用及各种实现方案做了详细的阐述，并提供了一种另类的实现。</p>
<p>为了更好的区分Bundle的功能特性和资源组织特性，我们在下面的讨论中将这两种不同侧重点的Bundle分别称之为“功能Bundle”和“资源Bundle”。</p>
<h2 id="OSGi-Bundle的特点"><a href="#OSGi-Bundle的特点" class="headerlink" title="OSGi Bundle的特点"></a>OSGi Bundle的特点</h2><p>OSGi框架为基于Java的系统开发提供了灵活的动态模块化支持。OSGi的模块层（Module Layer）为Java组件模块化提供了一种标准的解决方案。在OSGi中， Bundle部署成为一个Java Archive（JAR）压缩（ZIP格式）文件，该文件包含的内容有：提供某些功能的资源文件，如Java类文件，帮助文件，HTML文件，配置文件等等；一个元数据文件，用于描述该压缩文件的信息及其内部所包含的资源，OSGi框架使用这些元数据信息来安装并激活Bundle。</p>
<p>在OSGi中，每一个Bundle具有自己独有的 <strong>ClassSpace</strong>（详细信息参考OSGi规范）边界，Bundle间通过导出（<strong>Export</strong>）内部Java类，导入（<strong>Import</strong>）其他Bundle导出的Java类，来构造自己的ClassSpace边界。</p>
<p>Bundle之间也可以设定依赖关系，一个Bundle可以通过元数据 <strong>Require-Bundle</strong> 头来描述一个Bundle所依赖的其他Bundle列表。</p>
<p>OSGi中的Bundle接口提供了方法用于获取Bundle内部存储的资源，加载Bundle内部的Java类，通过实现BundleActivator接口获取BundeContext与其他Bunde进行交互。</p>
<h2 id="资源Bundle的应用需求"><a href="#资源Bundle的应用需求" class="headerlink" title="资源Bundle的应用需求"></a>资源Bundle的应用需求</h2><p>在现实环境中，应用系统为了提高适应性和可扩展性，系统的设计开发越来越依赖于配置而不是硬编码。不同的系统，根据各自特点的不同，对于配置的依赖程度是不同的。下面以企业应用集成中的EAI中间件实现为例说明配置资源对于系统的重要性。</p>
<p>举例来说，存在待集成的两个系统，一个系统提供数据库访问接口，另一个系统提供WebService接口。为了实现这两个系统的集成，可以选择如下方式：</p>
<ol>
<li><p>为此次集成需求做特定开发。这是最差的一种实现方式。</p>
</li>
<li><p>为数据库访问和WebService访问接口开发尽可能通用的模块，根据此次需求的差异性，对这些模块做适当定制开发。这是实际应用中最常见的实现方式。</p>
</li>
<li><p>开发通用的数据库访问接口和WebService访问接口模块，通过配置来处理实际需求的差异性。此种方式最为完美，但对模块的设计具有更高的要求。</p>
</li>
</ol>
<p>中间件系统为了能够集成各种各样的应用系统，必须采用上述第三种方式，因此，中间件的实现高度依赖配置。</p>
<p>系统集成的复杂度依赖与系统业务的复杂度，简单的系统集成可能仅需要一种或几种配置即可满足需求；但是对于复杂的业务系统集成需求，可能存在几十中甚至上百种配置。很明显的一个示例是两个应用系统之间需要传输几十种业务报文，随着业务的不断发展变化，业务报文的内容和数量在随时产生变化。采用上述三种方式中的前两种方案来解决此种需求就要面临不断地进行维护和开发的成本，而采用第三种方案则可以避免开发而仅仅维护配置，维护成本将大大降低。</p>
<p>下面我们来看一下资源Bundle在上述需求中的充当配置资源的优势：</p>
<ul>
<li><p>集中的资源配置控制。<br>可以将各种配置分散到各个资源Bundle中，通过OSGi框架统一管理这些资源Bundle。</p>
</li>
<li><p>资源配置的生命周期控制。<br>资源Bundle在OSGi中具有生命周期，可以控制资源Bundle的安装，卸载。</p>
</li>
<li><p>资源配置的状态处理。<br>资源Bundle在OSGi中的状态变化会产生事件，通过监听这些事件，可以对资源Bundle的各种状态进行内部处理。如可以捕获资源Bundle的安装事件对Bundle中的资源文件进行有效性检查。</p>
</li>
<li><p>资源配置可以包含程序代码。<br>系统在处理某种资源配置时可能需要为此种配置提供特定的程序扩展实现，使用资源Bundle就可以将扩展代码与资源配置打包在一起，进行统一管理。实际应用中最常见的例子是Java实体Bean。</p>
</li>
<li><p>资源Bundle的类空间（ClassSpace）隔离。<br>现实应用中，不同的用户可能共同使用同一个系统，并在此系统中设计自己的资源配置，如果用户的资源配置中可以包含Java类代码，则利用资源Bundle可以避免用户间的类代码冲突。</p>
</li>
<li><p>资源Bundle之间的依赖关系。<br>OSGi Bundle之间可以设定依赖关系，作为资源Bundle也可以设定对其他资源Bundle的依赖，这种依赖限定可以为资源配置提供额外的可靠性约束。</p>
</li>
</ul>
<p>资源Bundle在不同的应用中所体现的优势可能不同，大家可以充分结合实际需求来利用。</p>
<p>##资源Bundle的应用方案</p>
<p>###功能Bundle即资源Bundle</p>
<p>前述说过，资源Bundle是功能Bundle的基础，功能Bundle也是一个资源Bundle，如果该功能Bundle的配置资源比较固定并且简单，可以直接将配置资源放置于该Bundle内。此种方案在基于OSGi开发的系统中来的最为直接。</p>
<p>###在OSGI中资源Bundle与功能Bundle分离</p>
<p>某些功能Bundle可能需要多种资源配置，而各种资源配置可能具有自己的变更周期，为了不影响其他配置的使用，可以将这些配置拆分成独立的资源Bundle，由功能Bundle根据需要查找使用。</p>
<p>为了区分功能Bundle和资源Bundle，可以通过定制OSGi元数据头信息来实现。如在MANIFEST.MF文件中添加 <strong>Bundle-Type： Resource</strong> 的自定义属性来标明该Bundle是资源Bundle。并利用其他定制属性来标明该资源Bundle的具体业务信息。</p>
<p><img src="/images/java_osgi_resource_bundle_1.png" alt="Resource Bundle1"></p>
<p>如上图所示，功能Bundle和资源Bundle处于同一个OSGi框架之内。功能Bundle通过BundleContext可以查找资源Bundle并获取资源Bundle内的资源。这种方式的前提是系统必须基于OSGi框架开发。</p>
<h3 id="传统应用利用OSGi作为资源配置中心"><a href="#传统应用利用OSGi作为资源配置中心" class="headerlink" title="传统应用利用OSGi作为资源配置中心"></a>传统应用利用OSGi作为资源配置中心</h3><p>在传统应用中利用OSGi来作为资源配置中心，就需要将OSGi框架内嵌到自己的应用系统中。透过内嵌的OSGi框架获取该框架所管理的所有资源Bundle。目前，在各种OSGi的开源实现中，Felix为内嵌应用提供了很好的支持。</p>
<p>关于如何内嵌Felix，请参考Felix项目网站的相关文档。</p>
<p><img src="/images/java_osgi_resource_bundle_2.png" alt="Resource Bundle1"></p>
<h3 id="在OSGi环境中利用OSGi作为资源配置中心"><a href="#在OSGi环境中利用OSGi作为资源配置中心" class="headerlink" title="在OSGi环境中利用OSGi作为资源配置中心"></a>在OSGi环境中利用OSGi作为资源配置中心</h3><p>如前所述，资源Bundle和功能Bundle可以在同一个OSGi框架中共存，各个功能Bundle透过BundleContext控制和获取所需的资源Bundle中的资源，但是，此种应用方案存在明显的弊端，资源Bundle和功能Bundle混杂在一起难于控制，随着资源Bundle数量的增多，系统将会越来越复杂。</p>
<p>理想的解决方式就是将资源Bundle和功能Bundle分离，为资源Bundle提供单独的OSGi环境。因此，可以将OSGi框架实现作为一个独立的功能Bundle（反转OSGi，非System Bundle）作为资源Bundle的控制中心和入口点。如下图所示。</p>
<p><img src="/images/java_osgi_resource_bundle_3.png" alt="Resource Bundle1"></p>
<h2 id="结论"><a href="#结论" class="headerlink" title="结论"></a>结论</h2><p>OSGi为Java模块化系统开发提供了一种强大的解决方案。OSGi框架中所包含的各种设计思想可具有很高的利用价值。在OSGi环境中利用OSGi作为资源配置中心是一个很有意思的构想，在此构想的实现中过程中我们会面临一些非常有挑战的问题。</p>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>


    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
  <link itemprop="mainEntityOfPage" href="http://chrisrc.me/2015/05/28/alm-redmine-nginx/">

  <span style="display:none" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <meta itemprop="name" content="chrisrc">
    <meta itemprop="description" content="">
    <meta itemprop="image" content="/images/avatar.gif">
  </span>

  <span style="display:none" itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
    <meta itemprop="name" content="山中，山外与俯瞰">
    <span style="display:none" itemprop="logo" itemscope itemtype="http://schema.org/ImageObject">
      <img style="display:none;" itemprop="url image" alt="山中，山外与俯瞰" src="">
    </span>
  </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2015/05/28/alm-redmine-nginx/" itemprop="url">
                  Redmine Nginx服务配置
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>
              <time title="Post created" itemprop="dateCreated datePublished" datetime="2015-05-28T19:14:21+08:00">
                2015-05-28
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
              <span class="post-meta-divider">|</span>
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/IT自动化/" itemprop="url" rel="index">
                    <span itemprop="name">IT自动化</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <a href="/2015/05/28/alm-redmine-nginx/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count ds-thread-count" data-thread-key="2015/05/28/alm-redmine-nginx/" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          

          
          

          

          

        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <pre><code>http {
    passenger_root /usr/local/rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/passenger-5.0.14;
    passenger_ruby /usr/local/rbenv/versions/2.2.2/bin/ruby;

    passenger_default_user root;
    #passenger_default_group custom_group;

    ... ...

    sendfile on;
    tcp_nopush on;

    keepalive_timeout 65;

    gzip on;

    server {
        listen 80;
        server_name localhost;

        passenger_enabled on;

        #charset koi8-r;

        #access_log logs/host.access.log main;
        client_max_body_size 100M;

        location / {
            root /opt/redmine/public;
            index index.html index.htm;
        }

        ... ...

    }
}
</code></pre>
          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>


    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
  <link itemprop="mainEntityOfPage" href="http://chrisrc.me/2015/05/27/alm-redmine-mail/">

  <span style="display:none" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <meta itemprop="name" content="chrisrc">
    <meta itemprop="description" content="">
    <meta itemprop="image" content="/images/avatar.gif">
  </span>

  <span style="display:none" itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
    <meta itemprop="name" content="山中，山外与俯瞰">
    <span style="display:none" itemprop="logo" itemscope itemtype="http://schema.org/ImageObject">
      <img style="display:none;" itemprop="url image" alt="山中，山外与俯瞰" src="">
    </span>
  </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2015/05/27/alm-redmine-mail/" itemprop="url">
                  Redmine邮箱配置
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>
              <time title="Post created" itemprop="dateCreated datePublished" datetime="2015-05-27T13:54:21+08:00">
                2015-05-27
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
              <span class="post-meta-divider">|</span>
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/IT自动化/" itemprop="url" rel="index">
                    <span itemprop="name">IT自动化</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <a href="/2015/05/27/alm-redmine-mail/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count ds-thread-count" data-thread-key="2015/05/27/alm-redmine-mail/" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          

          
          

          

          

        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>上一篇文章简要记录了<a href="/2015-05-25/alm-redmine-install">Redmine的安装过程</a>。在实际应用中，Redmine的邮件功能是不可或缺的，网上大量的邮件资料相对比较旧，下面<br>以Redmine <code>3.0.4</code> 版的实际配置摘要供参考，同时备查。</p>
<h2 id="Redmine的邮箱配置"><a href="#Redmine的邮箱配置" class="headerlink" title="Redmine的邮箱配置"></a>Redmine的邮箱配置</h2><p>Redmine的邮箱通过修改<code>config/configuration.yml</code>文件进行配置：</p>
<figure class="highlight yaml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><span class="attr">email_delivery:</span></div><div class="line"><span class="attr">    delivery_method:</span> :async_smtp</div><div class="line"><span class="attr">    smtp_settings:</span></div><div class="line">        <span class="comment">#enable_starttls_auto: true</span></div><div class="line">        <span class="comment">#openssl_verify_mode: 'none'</span></div><div class="line"><span class="attr">        address:</span> <span class="string">"smtp.qq.com"</span></div><div class="line">        <span class="comment">#tls: true</span></div><div class="line"><span class="attr">        port:</span> <span class="number">25</span></div><div class="line"><span class="attr">        domain:</span> <span class="string">"smtp.qq.com"</span></div><div class="line"><span class="attr">        authentication:</span> :login <span class="comment">#:plain</span></div><div class="line"><span class="attr">        user_name:</span> <span class="string">"user@qq.com"</span></div><div class="line"><span class="attr">        password:</span> <span class="string">""</span></div></pre></td></tr></table></figure>
<p><strong>注意的问题：</strong>  </p>
<ol>
<li>配置并进行测试时，将<code>delivery_method</code>的值修改为<code>smtp</code>，可以看到同步测试的结果，配置测试成功后，修改为<code>async_smtp</code>用于异步发送邮件，<br>否则在创建更新问题时操作会卡顿。</li>
<li>邮件协议采用非SSL/TLS时，保持<code>#</code>注释行；采用SSL/TLS协议时，取消<code>#</code>行的注释。</li>
<li>在SSL/TLS协议下，<code>authentication</code>属性的值通常是： <strong>:plain</strong></li>
<li>上述文件配置完成后，启动Redmine，以 <strong>admin</strong> 用户登录，在管理界面—&gt;测试邮件发送页签中填写<code>邮件发送账号</code>，且邮件发送账号必须<br>与上述配置中的<code>user_name</code>一致。</li>
<li>以<code>admin</code>用户登录时，测试邮件的接收方为admin帐号，Redmine在安装时，admin用户的邮箱帐号默认是： <strong>admin@example.com</strong>，必须调整为实际可用帐号<br>否则发送的邮件因邮箱不可达，导致发送失败。</li>
<li>可以配置<code>config/database.yml</code>，将<code>development</code>数据库设定为与<code>production</code>数据库一致，启动测试服务器： <code>rails server webrick -e development</code>，<br>通过日志跟踪调试。</li>
</ol>
<h3 id="Redmine的邮箱机制"><a href="#Redmine的邮箱机制" class="headerlink" title="Redmine的邮箱机制"></a>Redmine的邮箱机制</h3><p>Redmine使用RoR中的 <a href="http://guides.rubyonrails.org/action_mailer_basics.html#introduction" target="_blank" rel="external"><strong>Action Mailer</strong></a>组件发送邮件。</p>
<p>关于 <strong>Action Mailer</strong> 的详细配置，请参考组件文档<a href="http://guides.rubyonrails.org/action_mailer_basics.html#action-mailer-configuration" target="_blank" rel="external">Action Mailer Configuration</a>。</p>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>


    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
  <link itemprop="mainEntityOfPage" href="http://chrisrc.me/2015/05/25/alm-redmine-install/">

  <span style="display:none" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <meta itemprop="name" content="chrisrc">
    <meta itemprop="description" content="">
    <meta itemprop="image" content="/images/avatar.gif">
  </span>

  <span style="display:none" itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
    <meta itemprop="name" content="山中，山外与俯瞰">
    <span style="display:none" itemprop="logo" itemscope itemtype="http://schema.org/ImageObject">
      <img style="display:none;" itemprop="url image" alt="山中，山外与俯瞰" src="">
    </span>
  </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2015/05/25/alm-redmine-install/" itemprop="url">
                  Redmine安装指南
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>
              <time title="Post created" itemprop="dateCreated datePublished" datetime="2015-05-25T10:43:28+08:00">
                2015-05-25
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
              <span class="post-meta-divider">|</span>
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/IT自动化/" itemprop="url" rel="index">
                    <span itemprop="name">IT自动化</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <a href="/2015/05/25/alm-redmine-install/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count ds-thread-count" data-thread-key="2015/05/25/alm-redmine-install/" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          

          
          

          

          

        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="Redmine安装指南"><a href="#Redmine安装指南" class="headerlink" title="Redmine安装指南"></a>Redmine安装指南</h2><p>越来越多的公司已经开始接受ALM的自动化管理，而ALM中的缺陷与项目协同的软件也越来越丰富，特别是基于云服务的软件。作为内部开发，采用云化的ALM系统值得商榷。PM软件中Atlassian的JIRA是应用最广的，只是仅提供商业版本。在开源项目管理系统中，Redmine算是功能比较完善，它强大的插件开发能力，基于ROR的快速开发，都为用户根据需要进行定制提供了最大程度的灵活性。</p>
<p>Redmine的安装非常简单，官方网站的文档基本上可以确保顺利安装，这里记录安装过程，以备查阅。</p>
<h2 id="Redmine安装"><a href="#Redmine安装" class="headerlink" title="Redmine安装"></a>Redmine安装</h2><p><strong>备注：</strong> 如果仅用于体验，可以到 <a href="http://bitnami.org" target="_blank" rel="external">http://bitnami.org</a> 直接下载一体化的安装包（支持Windows/Linux）。</p>
<h3 id="安装前准备"><a href="#安装前准备" class="headerlink" title="安装前准备"></a>安装前准备</h3><ul>
<li>到<a href="http://www.redmine.org" target="_blank" rel="external">官方网站</a>，下载redmine的<a href="http://www.redmine.org/projects/redmine/wiki/Download" target="_blank" rel="external">源代码</a></li>
<li>准备好ruby</li>
<li>准备mysql数据库</li>
</ul>
<h3 id="安装Ruby"><a href="#安装Ruby" class="headerlink" title="安装Ruby"></a>安装Ruby</h3><p>如果系统安装的Ruby版本较低，请通过 <strong>rbenv</strong> 切换ruby的版本，详细过程可参考：<br><a href="/2015-04-28/ruby-rbenv-switch-ruby-version">通过rbenv切换Ruby版本</a></p>
<p><strong>备注：尽量不要自己切换Ruby版本。</strong></p>
<h3 id="安装mysql"><a href="#安装mysql" class="headerlink" title="安装mysql"></a>安装mysql</h3><ul>
<li>数据库选用MySQL，按下面的脚本（根据自己的实际情况调整）创建数据库：  </li>
</ul>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">CREATE</span> <span class="keyword">DATABASE</span> redmine <span class="built_in">CHARACTER</span> <span class="keyword">SET</span> utf8;</div><div class="line"><span class="keyword">CREATE</span> <span class="keyword">USER</span> <span class="string">'redmine'</span>@<span class="string">'localhost'</span> <span class="keyword">IDENTIFIED</span> <span class="keyword">BY</span> <span class="string">'my_password'</span>;</div><div class="line"><span class="keyword">GRANT</span> ALL <span class="keyword">PRIVILEGES</span> <span class="keyword">ON</span> redmine.* <span class="keyword">TO</span> <span class="string">'redmine'</span>@<span class="string">'localhost'</span>;</div></pre></td></tr></table></figure>
<h3 id="配置Redmine"><a href="#配置Redmine" class="headerlink" title="配置Redmine"></a>配置Redmine</h3><ul>
<li>配置数据库连接  </li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">production:</div><div class="line">  adapter: mysql</div><div class="line">  database: redmine</div><div class="line">  host: localhost</div><div class="line">  username: redmine</div><div class="line">  password: my_password</div></pre></td></tr></table></figure>
<ul>
<li>进入到redemin目录下：</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">bundle install --without development test</div></pre></td></tr></table></figure>
<p>这个过程中可能需要安装的依赖（这是Ubuntu下的包名称，Fedora下可查询确认）：<code>ImageMagick libmagick++-dev uuid-dev libmysqld-dev</code></p>
<ul>
<li>数据库相关的配置</li>
</ul>
<p>待上述步骤完成后，按下述步骤生成数据库相关的配置（在redmine安装目录下执行）</p>
<ol>
<li><p>生成加密cookie的随机密钥<br><code>bundle exec rake generate_secret_token</code></p>
</li>
<li><p>创建数据库表及索引<br><code>RAILS_ENV=production bundle exec rake db:migrate</code></p>
</li>
<li><p>设定默认数据（locale）<br><code>RAILS_ENV=production bundle exec rake redmine:load_default_data</code></p>
</li>
<li><p>设定文件结构权限</p>
</li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">mkdir -p tmp tmp/pdf public/plugin_assets</div><div class="line">sudo chown -R redmine:redmine files log tmp public/plugin_assets(根据实际情况调整)</div><div class="line">sudo chmod -R 755 files log tmp public/plugin_assets</div></pre></td></tr></table></figure>
<h2 id="测试redmine的安装"><a href="#测试redmine的安装" class="headerlink" title="测试redmine的安装"></a>测试redmine的安装</h2><p><code>bundle exec rails server webrick -e production</code></p>
<p>通过访问<a href="http://localhost:3000/" target="_blank" rel="external">http://localhost:3000/</a> 检查是否安装成功。 登录用户名密码：admin/admin</p>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>


    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
  <link itemprop="mainEntityOfPage" href="http://chrisrc.me/2015/05/20/editor-sublime-text-3/">

  <span style="display:none" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <meta itemprop="name" content="chrisrc">
    <meta itemprop="description" content="">
    <meta itemprop="image" content="/images/avatar.gif">
  </span>

  <span style="display:none" itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
    <meta itemprop="name" content="山中，山外与俯瞰">
    <span style="display:none" itemprop="logo" itemscope itemtype="http://schema.org/ImageObject">
      <img style="display:none;" itemprop="url image" alt="山中，山外与俯瞰" src="">
    </span>
  </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2015/05/20/editor-sublime-text-3/" itemprop="url">
                  Sublime Text 3安装使用注记
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>
              <time title="Post created" itemprop="dateCreated datePublished" datetime="2015-05-20T12:26:27+08:00">
                2015-05-20
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
              <span class="post-meta-divider">|</span>
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/编辑器/" itemprop="url" rel="index">
                    <span itemprop="name">编辑器</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <a href="/2015/05/20/editor-sublime-text-3/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count ds-thread-count" data-thread-key="2015/05/20/editor-sublime-text-3/" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          

          
          

          

          

        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h2 id="安装Package-Control"><a href="#安装Package-Control" class="headerlink" title="安装Package Control"></a>安装Package Control</h2><p>转到<a href="https://packagecontrol.io" target="_blank" rel="external">Package Control</a>，首先安装Package Manager插件。阅读说明，学习如何通过Package Control安装其它插件。</p>
<h2 id="安装主题Theme"><a href="#安装主题Theme" class="headerlink" title="安装主题Theme"></a>安装主题Theme</h2><ul>
<li><p>Sublime text3主题: <a href="https://github.com/equinusocio/material-theme" target="_blank" rel="external">Material Theme</a><br>具体配置请参考链接。</p>
</li>
<li><p>Soda Theme  </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">&quot;theme&quot;: &quot;Soda Dark 3.sublime-theme&quot;</div></pre></td></tr></table></figure>
</li>
</ul>
<h2 id="接受中文输入（fcitx）"><a href="#接受中文输入（fcitx）" class="headerlink" title="接受中文输入（fcitx）"></a>接受中文输入（fcitx）</h2><h3 id="Ubuntu"><a href="#Ubuntu" class="headerlink" title="Ubuntu"></a>Ubuntu</h3><p><code>sudo apt-get install pkg-config build-essential libgtk2.0-dev</code></p>
<h3 id="openSUSE"><a href="#openSUSE" class="headerlink" title="openSUSE"></a>openSUSE</h3><p><code>sudo zypper in pkg-config build gtk2-devel</code></p>
<h3 id="下载补丁，编译"><a href="#下载补丁，编译" class="headerlink" title="下载补丁，编译"></a>下载补丁，编译</h3><p>下载下面的补丁代码<a href="/resources/sublime_imfix.c">sublime_imfix.c</a>，按下面的指令编译：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">gcc -shared -o libsublime-imfix.so sublime_imfix.c  `pkg-config --libs --cflags gtk+-2.0` -fPIC</div></pre></td></tr></table></figure></p>
<p>将生成的 <strong>libsublime-imfix.so</strong>拷贝到执行程序<code>sublime_text</code>所在的目录。按下面的命令启动Sublime Text3:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">LD_PRELOAD=./libsublime-imfix.so sublime_text</div></pre></td></tr></table></figure></p>
<p><strong>桌面图标启动命令的调整</strong><br>进入<code>/usr/share/applications</code>编辑<code>sublime_text.desktop</code>文件，修改三处 <code>Exec=</code>：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">[Desktop Entry]</div><div class="line">Exec=bash -c &apos;LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so /opt/sublime_text/sublime_text&apos; %F</div><div class="line"></div><div class="line">[Desktop Action Window]</div><div class="line">Exec=bash -c &apos;LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so /opt/sublime_text/sublime_text&apos; -n</div><div class="line"></div><div class="line">[Desktop Action Document]</div><div class="line">Exec=bash -c &apos;LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so /opt/sublime_text/sublime_text&apos; -n --command new_file</div></pre></td></tr></table></figure></p>
<p><strong>存在问题</strong>:同时打开多个Sublime窗口时，可能出现输入焦点错位的情况。</p>
<h2 id="快捷键设置"><a href="#快捷键设置" class="headerlink" title="快捷键设置"></a>快捷键设置</h2><h3 id="通用快捷键"><a href="#通用快捷键" class="headerlink" title="通用快捷键"></a>通用快捷键</h3><ul>
<li>Ctrl+Shift+P<br>打开Package Control</li>
<li>Ctrl+P<br>根据文件名打开文件。</li>
<li><p>Ctrl+R<br>打开源码文件后，找函数方法<br>-定位到行<br>Ctrl+G，或Ctrl+P后，在框中输入:行数</p>
</li>
<li><p>Ctrl+D<br>多处同步编辑。也可以用 <strong>鼠标 + 按键</strong> 配合:</p>
<ul>
<li>1）按住Ctrl，用鼠标左键双击要选择的位置；</li>
<li>2）按住Shift，再按住鼠标右键，向下拖动鼠标，进行列选。</li>
</ul>
</li>
<li><p>查找与替换<br>Ctrl+F， Ctrl+H， Ctrl+Shift+F</p>
</li>
<li><p>交换行<br>Ctrl + Shift + UP/DOWN</p>
</li>
<li><p>粘帖历史<br>Ctrl + K，V</p>
</li>
</ul>
<h3 id="自定义快捷键"><a href="#自定义快捷键" class="headerlink" title="自定义快捷键"></a>自定义快捷键</h3><p>快速切换Project Workspace，默认快捷键为：<code>Ctrl+Alt+P</code>，如果不可用，可在Key Bindings-User中添加如下配置）：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">&#123; &quot;keys&quot;: [&quot;shift+alt+p&quot;], &quot;command&quot;: &quot;prompt_select_workspace&quot; &#125;</div></pre></td></tr></table></figure></p>
<h2 id="跟踪调试"><a href="#跟踪调试" class="headerlink" title="跟踪调试"></a>跟踪调试</h2><p>通过快捷键 <strong>Ctrl+`</strong>打开控制台，输入：<br><code>sublime.log_commands(True)</code><br>回车，查看操作日志输出。</p>
<h2 id="安装插件"><a href="#安装插件" class="headerlink" title="安装插件"></a>安装插件</h2><h3 id="Markdown-Preview"><a href="#Markdown-Preview" class="headerlink" title="Markdown Preview"></a>Markdown Preview</h3><p>Markdown Preview支持内置的 python-markdown解析，也支持github markdown API 解析。</p>
<p>预览编辑的Markdown文档时，可通过<code>cmd+shift+P</code>，在输入框输入<code>Markdown Preview</code>，选择具体的操作。也可以通过绑定快捷键的方式（在Preferences&gt; Key Bindings-User中添加如下配置）：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">&#123; &quot;keys&quot;: [&quot;alt+m&quot;], &quot;command&quot;: &quot;markdown_preview&quot;, &quot;args&quot;: &#123;&quot;target&quot;: &quot;browser&quot;, &quot;parser&quot;:&quot;markdown&quot;&#125; &#125;</div></pre></td></tr></table></figure>
<p><strong>备注:</strong><br>可用配合<a href="https://packagecontrol.io/packages/LiveReload" target="_blank" rel="external">Live​Reload</a>自动更新编译结果。</p>
<h2 id="插件列表"><a href="#插件列表" class="headerlink" title="插件列表"></a>插件列表</h2><h3 id="通用"><a href="#通用" class="headerlink" title="通用"></a>通用</h3><ul>
<li>ConvertToUTF8<br>  支持 GBK, BIG5, EUC-KR, EUC-JP, Shift_JIS 等编码的插件</li>
<li>Emmet<br>  快速生成HTML代码段的插件，强大到无与伦比…</li>
<li>BracketHighlighter<br>  用于匹配括号，引号和html标签。对于很长的代码很有用。安装好之后，不需要设置插件会自动生效</li>
<li>Git</li>
<li>Alignment</li>
<li><a href="https://packagecontrol.io/packages/SideBarEnhancements" target="_blank" rel="external">SideBarEnhancements</a><br>  改进了侧边栏，增加了许多功能</li>
<li><a href="https://packagecontrol.io/packages/SublimeCodeIntel" target="_blank" rel="external">SublimeCodeIntel</a></li>
<li><p><a href="https://packagecontrol.io/packages/Terminal" target="_blank" rel="external">Terminal</a></p>
</li>
<li><p><a href="https://packagecontrol.io/packages/SublimeREPL" target="_blank" rel="external">SublimeREPL</a></p>
</li>
</ul>
<h3 id="Ruby"><a href="#Ruby" class="headerlink" title="Ruby"></a>Ruby</h3><ul>
<li><a href="https://packagecontrol.io/packages/RSpec" target="_blank" rel="external">RSpec</a></li>
<li><a href="https://packagecontrol.io/packages/CTags" target="_blank" rel="external">CTags</a></li>
</ul>
<h3 id="Markdown"><a href="#Markdown" class="headerlink" title="Markdown"></a>Markdown</h3><ul>
<li>Markdown Preview</li>
<li>Live​Reload</li>
</ul>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>


    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
  <link itemprop="mainEntityOfPage" href="http://chrisrc.me/2015/05/12/linux-mysql-opensuse-up/">

  <span style="display:none" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <meta itemprop="name" content="chrisrc">
    <meta itemprop="description" content="">
    <meta itemprop="image" content="/images/avatar.gif">
  </span>

  <span style="display:none" itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
    <meta itemprop="name" content="山中，山外与俯瞰">
    <span style="display:none" itemprop="logo" itemscope itemtype="http://schema.org/ImageObject">
      <img style="display:none;" itemprop="url image" alt="山中，山外与俯瞰" src="">
    </span>
  </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2015/05/12/linux-mysql-opensuse-up/" itemprop="url">
                  配置openSUSE上自动安装的MySQL(MariaDB)
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>
              <time title="Post created" itemprop="dateCreated datePublished" datetime="2015-05-12T15:38:27+08:00">
                2015-05-12
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
              <span class="post-meta-divider">|</span>
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/Linux/" itemprop="url" rel="index">
                    <span itemprop="name">Linux</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <a href="/2015/05/12/linux-mysql-opensuse-up/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count ds-thread-count" data-thread-key="2015/05/12/linux-mysql-opensuse-up/" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          

          
          

          

          

        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p><strong>openSUSE</strong> 默认已经自动安装了Mysql的开源替代版本 <strong>MariaDB</strong>。下面简要记录第一次启用数据库时的简要配置，备查。</p>
<h4 id="启动Mysql数据库-root权限"><a href="#启动Mysql数据库-root权限" class="headerlink" title="启动Mysql数据库(root权限)"></a>启动Mysql数据库(root权限)</h4><blockquote>
<p>systemctl enable mysql.service<br>systemctl start mysql.service</p>
</blockquote>
<h4 id="设置root用户的密码"><a href="#设置root用户的密码" class="headerlink" title="设置root用户的密码"></a>设置root用户的密码</h4><blockquote>
<p>mysqladmin -u root password  ‘NEW PASSWORD’</p>
</blockquote>
<h4 id="连接数据库"><a href="#连接数据库" class="headerlink" title="连接数据库"></a>连接数据库</h4><blockquote>
<p>mysql -u root -p</p>
</blockquote>
<p><img src="/images/linux_mysql_console_login.png" alt="Myslq Console"></p>
<h4 id="常用数据库操作"><a href="#常用数据库操作" class="headerlink" title="常用数据库操作"></a>常用数据库操作</h4><ul>
<li><p>显示数据库实例：  </p>
<blockquote>
<p>show databases;</p>
</blockquote>
</li>
<li><p>创建数据库:  </p>
<blockquote>
<p>create database &lt;数据库名&gt; default charset utf8 collate utf8_general_ci;</p>
</blockquote>
</li>
<li><p>创建用户并授权：  </p>
<blockquote>
<p>create user ‘&lt;用户名&gt;’@’%’ identified by ‘&lt;用户密码&gt;’;<br>grant all privileges on &lt;数据库&gt; to ‘&lt;用户名&gt;’@’%’ ;</p>
</blockquote>
</li>
</ul>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>


    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
  <link itemprop="mainEntityOfPage" href="http://chrisrc.me/2015/05/07/java-osgi-resource-bundle/">

  <span style="display:none" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <meta itemprop="name" content="chrisrc">
    <meta itemprop="description" content="">
    <meta itemprop="image" content="/images/avatar.gif">
  </span>

  <span style="display:none" itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
    <meta itemprop="name" content="山中，山外与俯瞰">
    <span style="display:none" itemprop="logo" itemscope itemtype="http://schema.org/ImageObject">
      <img style="display:none;" itemprop="url image" alt="山中，山外与俯瞰" src="">
    </span>
  </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2015/05/07/java-osgi-resource-bundle/" itemprop="url">
                  理解OSGi Fragment Bundle
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>
              <time title="Post created" itemprop="dateCreated datePublished" datetime="2015-05-07T11:16:17+08:00">
                2015-05-07
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
              <span class="post-meta-divider">|</span>
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/OSGi/" itemprop="url" rel="index">
                    <span itemprop="name">OSGi</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <a href="/2015/05/07/java-osgi-resource-bundle/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count ds-thread-count" data-thread-key="2015/05/07/java-osgi-resource-bundle/" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          

          
          

          

          

        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p>Fragment Bundle是一个可追加于一个或多个主体（Host）Bundle的Bundle。Fragment Bundle与其Host Bundle之间是从主关系，并且Fragment Bundle不能独立运行，它在Host Bundle解析之前被框架追加到Host Bundle，随之被看作是Host Bundle的一部分。 Fragment Bundle具有自己的保护域，但没有自己的Class loader。</p>
<p>具有相同的Symbolic Name且版本不同的Fragment bundle 可以追加到多个Host bundle。如果存在多个具有相同Fragment bundle应用的一个主要场景是用来提供不同语言的翻译包，在这种模式下，每种语言包可以作为独立的Fragment bundle存在。</p>
<p>当一个已追加的fragment更新时，之前追加到Host bundle的内容会继续保留。新的fragment内容只有在框架重启或者Host bundle刷新时才会追加到Host。在这种情况下，fragment具有两个版本：已追加的版本；可以追加到新的Host或其它host bundle的新的fragment bundle。</p>
<p>当框架追加一个fragment bundle到一个host bundle时，按下述步骤操作:</p>
<ol>
<li><p>如果Package导入不冲突，将Fragemnt bundle的包导入定义（Import-Package）附加到Host Bundle的包导入定义中。Fragment可以导入Host bundle的私有包（Private-Package），此时，Host bundle中此包仍保持私有；</p>
</li>
<li><p>在Require-Bundle定义不冲突的前提下，将Fragment bundle的Require bundle定义附加到Host bundle的Require bundle定义中；</p>
</li>
<li><p>将Fragemnt bundle的Export-Package定义附加到Host bundle的Export-Package定义中。如果Fragment的某个Package的导出定义与Host中导出包的定义完全一致（包名、标记和属性），则此包忽略，否则必须附加。即，可以导出同名包的多个版本。</p>
</li>
<li><p>附加Provide-Capability到Host bundle定义；</p>
</li>
<li>附加Require-Capability到Host bundle定义；</li>
</ol>
<p>如果Host和Fragment不能提供一致的类空间，则会产生冲突。如果存在冲突，Fragment bundle则不能追加到Host。</p>
<p>当且仅当一个Fragment bundle成功追加到至少一个Host bundle时，此Fragment bundle进入Resolved状态。</p>
<p>在运行时，fragment的jar在类路径查找中位于host bundle的类路径查找之后。</p>
<p>Fragment bundle不能出现在其他bundle的Require-Bundle定义中。</p>
<p>Fragment-Host清单头的语法定义：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">Fragment-Host        ::= bundle-description  </div><div class="line">Bundle-description   ::= symbolic-name(&apos;;&apos;parameter)*</div></pre></td></tr></table></figure>
<p>Fragment-Host可配置的标记属性：</p>
<table>
<thead>
<tr>
<th style="text-align:left">属性</th>
<th style="text-align:left">值</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"></td>
</tr>
</tbody>
</table>
<p>Extension（仅在Fragment-Host是系统bundle（id=0)时允许此标记）| framework/bootclasspath | framework：fragment bundle是框架的扩展bundle; bootclasspath：fragment bundle是启动类路径的扩展bundle<br>Bundle-version | [0.0.0,∞) | 如果属性值是一个范围，则fragment bundle将追加到所有符合条件的host</p>
<p>逻辑上，从fragment bundle追加到host bundle开始，fragment bundle就是host bundle的一部分，fragment bundle中的所有类及资源都由host bundle的类加载器加载。</p>
<p>Host自身的类查找路径在其所有的fragment bundle类路径之前；fragment bundle的类查找路径顺序按照fragment bundle ID的升序排列。</p>
<p>Fragment bundle的另一个常见用途是扩大现有bundle的类加载范围，比如commons-dbcp bundle需要加载各种数据库的jdbc驱动，可以将这些驱动封装为commons-dbcp的fragment bundle。如果已有的jdbc驱动需要独立bundle存在，则可以封装一个该驱动的wrpper fragment bundle。</p>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>


    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
  <link itemprop="mainEntityOfPage" href="http://chrisrc.me/2015/04/28/ruby-rbenv-switch-ruby-version/">

  <span style="display:none" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <meta itemprop="name" content="chrisrc">
    <meta itemprop="description" content="">
    <meta itemprop="image" content="/images/avatar.gif">
  </span>

  <span style="display:none" itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
    <meta itemprop="name" content="山中，山外与俯瞰">
    <span style="display:none" itemprop="logo" itemscope itemtype="http://schema.org/ImageObject">
      <img style="display:none;" itemprop="url image" alt="山中，山外与俯瞰" src="">
    </span>
  </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2015/04/28/ruby-rbenv-switch-ruby-version/" itemprop="url">
                  通过rbenv切换Ruby版本
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>
              <time title="Post created" itemprop="dateCreated datePublished" datetime="2015-04-28T12:16:27+08:00">
                2015-04-28
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
              <span class="post-meta-divider">|</span>
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/Ruby/" itemprop="url" rel="index">
                    <span itemprop="name">Ruby</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <a href="/2015/04/28/ruby-rbenv-switch-ruby-version/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count ds-thread-count" data-thread-key="2015/04/28/ruby-rbenv-switch-ruby-version/" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          

          
          

          

          

        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <h3 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h3><p>作为ruby开发的新手，手动切换ruby版本就碰到了麻烦。在openSUSE下ruby的版本是1.9，想升级为2.x，网上都推荐rvm和rbenv，觉得麻烦，就下载了ruby-2.2.2.tar.gz自己编译安装，没想到更是麻烦，而且遇坑无数…,最后还是选择用rbenv切换。</p>
<h3 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h3><p>根据如下指令，重新设定ruby的国内镜像: <strong><a href="http://ruby.taobao.org/" target="_blank" rel="external">http://ruby.taobao.org/</a></strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">gem sources --remove https://rubygems.org/</div><div class="line">gem sources -a https://ruby.taobao.org/</div><div class="line">gem sources -l</div></pre></td></tr></table></figure>
<p><strong>注意：</strong> 请确保只有 <code>ruby.taobao.org</code> 一个ruby源。</p>
<p><code>gem install rails</code></p>
<p>如果你使用 Gemfile 和 Bundle (例如：Rails 项目)</p>
<p>你可以用bundle的gem源代码镜像命令。</p>
<p><code>bundle config mirror.https://rubygems.org https://ruby.taobao.org</code></p>
<p>这样你不用改你的 Gemfile 的 source。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">source &apos;https://rubygems.org/&apos;</div><div class="line">gem &apos;rails&apos;, &apos;4.1.0&apos;</div><div class="line">...</div></pre></td></tr></table></figure>
<h3 id="rbenv环境安装"><a href="#rbenv环境安装" class="headerlink" title="rbenv环境安装"></a>rbenv环境安装</h3><p><a href="https://github.com/sstephenson/rbenv" target="_blank" rel="external">rbenv官网</a></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">git clone https://github.com/sstephenson/rbenv.git ~/.rbenv</div><div class="line">echo &apos;export PATH=&quot;$HOME/.rbenv/bin:$PATH&quot;&apos; &gt;&gt; ~/.bashrc</div><div class="line">echo &apos;eval &quot;$(rbenv init -)&quot;&apos; &gt;&gt; ~/.bashrc</div><div class="line">source ~/.bashrc</div><div class="line">type rbenv</div></pre></td></tr></table></figure>
<h3 id="ruby-build安装"><a href="#ruby-build安装" class="headerlink" title="ruby-build安装"></a>ruby-build安装</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build</div></pre></td></tr></table></figure>
<h3 id="ruby环境安装，首先列出可安装的版本，然后选择后进行下载编译"><a href="#ruby环境安装，首先列出可安装的版本，然后选择后进行下载编译" class="headerlink" title="ruby环境安装，首先列出可安装的版本，然后选择后进行下载编译"></a>ruby环境安装，首先列出可安装的版本，然后选择后进行下载编译</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">rbenv install -l</div><div class="line">rbenv install 2.2.2</div></pre></td></tr></table></figure>
<h3 id="设置当前使用的ruby版本并将gem的源改为淘宝镜像"><a href="#设置当前使用的ruby版本并将gem的源改为淘宝镜像" class="headerlink" title="设置当前使用的ruby版本并将gem的源改为淘宝镜像"></a>设置当前使用的ruby版本并将gem的源改为淘宝镜像</h3><p>rbenv global 2.2.2<br>rbenv rehash</p>
<h3 id="安装rails"><a href="#安装rails" class="headerlink" title="安装rails"></a>安装rails</h3><p>gem install bundler rails</p>
<h3 id="检查安装后的软件版本"><a href="#检查安装后的软件版本" class="headerlink" title="检查安装后的软件版本"></a>检查安装后的软件版本</h3><p>ruby -v<br>gem -v<br>rake -V<br>rails -v</p>

          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>


    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
      

  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">
  <link itemprop="mainEntityOfPage" href="http://chrisrc.me/2014/01/01/linux-commands-curl/">

  <span style="display:none" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <meta itemprop="name" content="chrisrc">
    <meta itemprop="description" content="">
    <meta itemprop="image" content="/images/avatar.gif">
  </span>

  <span style="display:none" itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
    <meta itemprop="name" content="山中，山外与俯瞰">
    <span style="display:none" itemprop="logo" itemscope itemtype="http://schema.org/ImageObject">
      <img style="display:none;" itemprop="url image" alt="山中，山外与俯瞰" src="">
    </span>
  </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                
                <a class="post-title-link" href="/2014/01/01/linux-commands-curl/" itemprop="url">
                  Linux常用命令注记——CURL
                </a>
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>
              <time title="Post created" itemprop="dateCreated datePublished" datetime="2014-01-01T01:01:01+08:00">
                2014-01-01
              </time>
            

            

            
          </span>

          
            <span class="post-category" >
              <span class="post-meta-divider">|</span>
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/Linux/" itemprop="url" rel="index">
                    <span itemprop="name">Linux</span>
                  </a>
                </span>

                
                
              
            </span>
          

          
            
              <span class="post-comments-count">
                <span class="post-meta-divider">|</span>
                <a href="/2014/01/01/linux-commands-curl/#comments" itemprop="discussionUrl">
                  <span class="post-comments-count ds-thread-count" data-thread-key="2014/01/01/linux-commands-curl/" itemprop="commentCount"></span>
                </a>
              </span>
            
          

          

          
          

          

          

        </div>
      </header>
    


    <div class="post-body" itemprop="articleBody">

      
      

      
        
          
            <p><strong>转载</strong>：<a href="https://gist.github.com/303182519/132568fd0e58cae57202，" target="_blank" rel="external">https://gist.github.com/303182519/132568fd0e58cae57202，</a> 版权归原作者所有。</p>
<h3 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h3><ul>
<li><a href="http://bbs.et8.net/bbs/showthread.php?t=568472" target="_blank" rel="external">http://bbs.et8.net/bbs/showthread.php?t=568472</a></li>
<li><a href="http://www.ruanyifeng.com/blog/2011/09/curl.html" target="_blank" rel="external">http://www.ruanyifeng.com/blog/2011/09/curl.html</a></li>
</ul>
<h3 id="下载单个文件，默认将输出打印到标准输出中-STDOUT-中"><a href="#下载单个文件，默认将输出打印到标准输出中-STDOUT-中" class="headerlink" title="下载单个文件，默认将输出打印到标准输出中(STDOUT)中"></a>下载单个文件，默认将输出打印到标准输出中(STDOUT)中</h3><pre><code>curl http://www.centos.org
</code></pre><h3 id="通过-o-O选项保存下载的文件到指定的文件中："><a href="#通过-o-O选项保存下载的文件到指定的文件中：" class="headerlink" title="通过-o/-O选项保存下载的文件到指定的文件中："></a>通过-o/-O选项保存下载的文件到指定的文件中：</h3><blockquote>
<ol>
<li>-o：将文件保存为命令行中指定的文件名的文件中</li>
<li>-O：使用URL中默认的文件名保存文件到本地</li>
</ol>
</blockquote>
<pre><code># 将文件下载到本地并命名为mygettext.html
  curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html

# 将文件保存到本地并命名为gettext.html
  curl -O http://www.gnu.org/software/gettext/manual/gettext.html
</code></pre><p>同样可以使用转向字符”&gt;”对输出进行转向输出</p>
<h3 id="同时获取多个文件"><a href="#同时获取多个文件" class="headerlink" title="同时获取多个文件"></a>同时获取多个文件</h3><pre><code>curl -O URL1 -O URL2
</code></pre><p>若同时从同一站点下载多个文件时，curl会尝试重用链接(connection)。</p>
<p>通过-L选项进行重定向<br>默认情况下CURL不会发送HTTP Location headers(重定向).当一个被请求页面移动到另一个站点时，会发送一个HTTP Loaction header作为请求，然后将请求重定向到新的地址上。<br>例如：访问google.com时，会自动将地址重定向到google.com.hk上。</p>
<pre><code>curl http://www.google.com
&lt;HTML&gt;
&lt;HEAD&gt;
    &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html;charset=utf-8&quot;&gt;
    &lt;TITLE&gt;302 Moved&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;
    &lt;H1&gt;302 Moved&lt;/H1&gt;
    The document has moved
    &lt;A HREF=&quot;http://www.google.com.hk/url?sa=p&amp;amp;hl=zh-CN&amp;amp;pref=hkredirect&amp;amp;pval=yes&amp;amp;q=http://www.google.com.hk/&amp;amp;ust=1379402837567135amp;usg=AFQjCNF3o7umf3jyJpNDPuF7KTibavE4aA&quot;&gt;here&lt;/A&gt;.
&lt;/BODY&gt;
&lt;/HTML&gt;
</code></pre><p>上述输出说明所请求的档案被转移到了<a href="http://www.google.com.hk。" target="_blank" rel="external">http://www.google.com.hk。</a></p>
<p>这是可以通过使用-L选项进行强制重定向</p>
<pre><code>让curl使用地址重定向，此时会查询google.com.hk站点
curl -L http://www.google.com
</code></pre><h3 id="断点续传"><a href="#断点续传" class="headerlink" title="断点续传"></a>断点续传</h3><p>通过使用-C选项可对大文件使用断点续传功能，如：</p>
<pre><code># 当文件在下载完成之前结束该进程
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
##############             20.1%

# 通过添加-C选项继续对该文件进行下载，已经下载过的文件不会被重新下载
curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html
###############            21.1%
</code></pre><h3 id="对CURL使用网络限速"><a href="#对CURL使用网络限速" class="headerlink" title="对CURL使用网络限速"></a>对CURL使用网络限速</h3><p>通过–limit-rate选项对CURL的最大网络使用进行限制</p>
<pre><code>下载速度最大不会超过1000B/second

curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html
</code></pre><p>下载指定时间内修改过的文件</p>
<p>当下载一个文件时，可对该文件的最后修改日期进行判断，如果该文件在指定日期内修改过，就进行下载，否则不下载。<br>该功能可通过使用-z选项来实现：</p>
<pre><code>若yy.html文件在2011/12/21之后有过更新才会进行下载
curl -z 21-Dec-11 http://www.example.com/yy.html
</code></pre><h3 id="CURL授权"><a href="#CURL授权" class="headerlink" title="CURL授权"></a>CURL授权</h3><p>在访问需要授权的页面时，可通过-u选项提供用户名和密码进行授权</p>
<pre><code>curl -u username:password URL

# 通常的做法是在命令行只输入用户名，之后会提示输入密码，这样可以保证在查看历史记录时不会将密码泄露
curl -u username URL
</code></pre><h3 id="从FTP服务器下载文件"><a href="#从FTP服务器下载文件" class="headerlink" title="从FTP服务器下载文件"></a>从FTP服务器下载文件</h3><p>CURL同样支持FTP下载，若在url中指定的是某个文件路径而非具体的某个要下载的文件名，CURL则会列出该目录下的所有文件名而并非下载该目录下的所有文件</p>
<pre><code># 列出public_html下的所有文件夹和文件
curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/

# 下载xss.php文件
curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php
</code></pre><h3 id="上传文件到FTP服务器"><a href="#上传文件到FTP服务器" class="headerlink" title="上传文件到FTP服务器"></a>上传文件到FTP服务器</h3><p>通过 -T 选项可将指定的本地文件上传到FTP服务器上</p>
<pre><code># 将myfile.txt文件上传到服务器
curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com

# 同时上传多个文件
curl -u ftpuser:ftppass -T &quot;{file1,file2}&quot; ftp://ftp.testserver.com

# 从标准输入获取内容保存到服务器指定的文件中
curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt
</code></pre><h3 id="获取更多信息"><a href="#获取更多信息" class="headerlink" title="获取更多信息"></a>获取更多信息</h3><p>通过使用 -v 和 -trace获取更多的链接信息</p>
<h3 id="通过字典查询单词"><a href="#通过字典查询单词" class="headerlink" title="通过字典查询单词"></a>通过字典查询单词</h3><pre><code># 查询bash单词的含义
curl dict://dict.org/d:bash

# 列出所有可用词典
curl dict://dict.org/show:db

# 在foldoc词典中查询bash单词的含义
curl dict://dict.org/d:bash:foldoc
</code></pre><h3 id="为CURL设置代理"><a href="#为CURL设置代理" class="headerlink" title="为CURL设置代理"></a>为CURL设置代理</h3><p>x 选项可以为CURL添加代理功能</p>
<pre><code># 指定代理主机和端口
curl -x proxysever.test.com:3128 http://google.co.in
</code></pre><h3 id="保存与使用网站cookie信息"><a href="#保存与使用网站cookie信息" class="headerlink" title="保存与使用网站cookie信息"></a>保存与使用网站cookie信息</h3><pre><code># 将网站的cookies信息保存到sugarcookies文件中
curl -D sugarcookies http://localhost/sugarcrm/index.php

# 使用上次保存的cookie信息
curl -b sugarcookies http://localhost/sugarcrm/index.php
</code></pre><h3 id="传递请求数据"><a href="#传递请求数据" class="headerlink" title="传递请求数据"></a>传递请求数据</h3><p>默认curl使用GET方式请求数据，这种方式下直接通过URL传递数据<br>可以通过 –data/-d 方式指定使用POST方式传递数据</p>
<pre><code># GET
curl -u username https://api.github.com/user?access_token=XXXXXXXXXX

# POST
curl -u username --data &quot;param1=value1&amp;param2=value&quot; https://api.github.com

# 也可以指定一个文件，将该文件中的内容当作数据传递给服务器端
curl --data @filename https://github.api.com/authorizations
</code></pre><p>注：默认情况下，通过POST方式传递过去的数据中若有特殊字符，首先需要将特殊字符转义在传递给服务器端，如value值中包含有空格，则需要先将空格转换成%20，如：</p>
<pre><code>curl -d &quot;value%201&quot; http://hostname.com
</code></pre><p>在新版本的CURL中，提供了新的选项 –data-urlencode，通过该选项提供的参数会自动转义特殊字符。</p>
<pre><code>curl --data-urlencode &quot;value 1&quot; http://hostname.com
</code></pre><p>除了使用GET和POST协议外，还可以通过 -X 选项指定其它协议，如：</p>
<pre><code>curl -I -X DELETE https://api.github.cim
</code></pre><p>上传文件</p>
<pre><code>curl --form &quot;fileupload=@filename.txt&quot; http://hostname/resource
</code></pre>
          
        
      
    </div>

    <div>
      
    </div>

    <div>
      
    </div>


    <footer class="post-footer">
      

      

      
      
        <div class="post-eof"></div>
      
    </footer>
  </article>


    
  </section>

  
  <nav class="pagination">
    <a class="extend prev" rel="prev" href="/page/6/"><i class="fa fa-angle-left"></i></a><a class="page-number" href="/">1</a><span class="space">&hellip;</span><a class="page-number" href="/page/6/">6</a><span class="page-number current">7</span>
  </nav>



          </div>
          


          

        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    <div class="sidebar-inner">

      

      

      <section class="site-overview sidebar-panel sidebar-panel-active">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/images/avatar.gif"
               alt="chrisrc" />
          <p class="site-author-name" itemprop="name">chrisrc</p>
          <p class="site-description motion-element" itemprop="description"></p>
        </div>
        <nav class="site-state motion-element">
          <div class="site-state-item site-state-posts">
            <a href="/archives">
              <span class="site-state-item-count">69</span>
              <span class="site-state-item-name">日志</span>
            </a>
          </div>

          
            <div class="site-state-item site-state-categories">
              <a href="/categories">
                <span class="site-state-item-count">21</span>
                <span class="site-state-item-name">分类</span>
              </a>
            </div>
          

          
            <div class="site-state-item site-state-tags">
              <a href="/tags">
                <span class="site-state-item-count">162</span>
                <span class="site-state-item-name">标签</span>
              </a>
            </div>
          

        </nav>

        

        <div class="links-of-author motion-element">
          
            
              <span class="links-of-author-item">
                <a href="https://github.com/christtrc" target="_blank" title="GitHub">
                  
                    <i class="fa fa-fw fa-github"></i>
                  
                  GitHub
                </a>
              </span>
            
              <span class="links-of-author-item">
                <a href="https://twitter.com/chrisrc" target="_blank" title="Twitter">
                  
                    <i class="fa fa-fw fa-twitter"></i>
                  
                  Twitter
                </a>
              </span>
            
          
        </div>

        
        
          <div class="cc-license motion-element" itemprop="license">
            <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" class="cc-opacity" target="_blank">
              <img src="/images/cc-by-nc-sa.svg" alt="Creative Commons" />
            </a>
          </div>
        

        
        

        


      </section>

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy;  2015 - 
  <span itemprop="copyrightYear">2017</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">
     
      <a href="mailto:chrisrc@qq.com">chrisrc</a> 
    
  </span>
  <span class="author"> &nbsp; QQ: 58122705 </span>
</div>


<div class="powered-by">
  由 <a class="theme-link" href="https://hexo.io">Hexo</a> 强力驱动
</div>

<div class="theme-info">
  主题 -
  <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
    NexT.Mist
  </a>
</div>


        

        
      </div>
    </footer>

    <div class="back-to-top">
      <i class="fa fa-arrow-up"></i>
    </div>
  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  



  
  <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>

  
  <script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  
  <script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  
  <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.1.0"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.1.0"></script>



  
  

  

  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.0"></script>



  

  
    
  

  <script type="text/javascript">
    var duoshuoQuery = {short_name:"chrisrc"};
    (function() {
      var ds = document.createElement('script');
      ds.type = 'text/javascript';ds.async = true;
      ds.id = 'duoshuo-script';
      ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
      ds.charset = 'UTF-8';
      (document.getElementsByTagName('head')[0]
      || document.getElementsByTagName('body')[0]).appendChild(ds);
    })();
  </script>

  
    
    
    <script src="/lib/ua-parser-js/dist/ua-parser.min.js?v=0.7.9"></script>
    <script src="/js/src/hook-duoshuo.js"></script>
  








  
  

  

  

  
<script>
(function(){
    var bp = document.createElement('script');
    var curProtocol = window.location.protocol.split(':')[0];
    if (curProtocol === 'https') {
        bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';        
    }
    else {
        bp.src = 'http://push.zhanzhang.baidu.com/push.js';
    }
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(bp, s);
})();
</script>


  
<script>
(function(){
   var src = (document.location.protocol == "http:") ? "http://js.passport.qihucdn.com/11.0.1.js?ed903ab05fbc5fa64d95e4bfbf3d3a04":"https://jspassport.ssl.qhimg.com/11.0.1.js?ed903ab05fbc5fa64d95e4bfbf3d3a04";
   document.write('<script src="' + src + '" id="sozz"><\/script>');
})();
</script>

  


</body>
</html>
